#ifndef DTU_DATA_PUSH_H
#define DTU_DATA_PUSH_H

#include "dtu_common.h"
#include "dtu_data_collect.h"

/* 推送配置 - 使用与dtu_config.h兼容的定义 */
typedef struct {
    push_protocol_t protocol; /* 推送协议 */
    data_format_t format;     /* 数据格式 */
    char server_host[128];    /* 服务器地址 */
    int server_port;          /* 服务器端口 */
    char username[64];        /* 用户名 */
    char password[128];       /* 密码 - 增大以支持长密码 */
    char topic[128];          /* MQTT主题或HTTP路径 */
    char client_id[128];      /* 客户端ID - 增大以支持长ID */
    int timeout;              /* 超时时间(秒) */
    int retry_count;          /* 重试次数 */
    int retry_interval;       /* 重试间隔(秒) */
    bool enable_ssl;          /* 启用SSL/TLS */
    bool enable_compression;  /* 启用压缩 */
    int keepalive;            /* 保活时间(秒) */
    bool clean_session;       /* 清除会话 */
} push_config_t;

/* 推送任务结构 */
typedef struct push_task {
    char task_id[64];         /* 任务ID */
    collect_result_t* data;   /* 采集数据 */
    push_config_t config;     /* 推送配置 */
    time_t create_time;       /* 创建时间 */
    time_t retry_time;        /* 重试时间 */
    int retry_count;          /* 已重试次数 */
    bool urgent;              /* 紧急标志 */
    struct push_task* next;   /* 下一个任务 */
} push_task_t;

/* 推送统计信息 */
typedef struct {
    uint32_t total_tasks;     /* 总任务数 */
    uint32_t successful_tasks; /* 成功任务数 */
    uint32_t failed_tasks;    /* 失败任务数 */
    uint32_t pending_tasks;   /* 待处理任务数 */
    uint32_t retry_tasks;     /* 重试任务数 */
    uint64_t total_bytes;     /* 总发送字节数 */
    time_t last_push_time;    /* 最后推送时间 */
    time_t start_time;        /* 开始时间 */
} push_stats_t;

/* 推送管理器结构 */
typedef struct {
    push_config_t config;     /* 推送配置 */
    push_task_t* task_queue;  /* 任务队列 */
    pthread_t push_thread;    /* 推送线程 */
    pthread_mutex_t mutex;    /* 互斥锁 */
    pthread_cond_t cond;      /* 条件变量 */
    bool initialized;         /* 初始化标志 */
    bool running;             /* 运行状态 */
    push_stats_t stats;       /* 统计信息 */
    
    /* 连接状态 */
    bool connected;           /* 连接状态 */
    time_t last_connect_time; /* 最后连接时间 */
    int connection_failures;  /* 连接失败次数 */
    
    /* 回调函数 */
    void (*status_callback)(bool connected, const char* message, void* user_data);
    void* callback_user_data;
} push_manager_t;

/* 推送结果结构 */
typedef struct {
    char task_id[64];         /* 任务ID */
    bool success;             /* 推送结果 */
    int error_code;           /* 错误码 */
    char error_message[256];  /* 错误消息 */
    time_t push_time;         /* 推送时间 */
    size_t bytes_sent;        /* 发送字节数 */
} push_result_t;

/* 函数声明 */

/**
 * @brief 初始化数据推送管理器
 * @param config 推送配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_init(const push_config_t* config);

/**
 * @brief 销毁数据推送管理器
 */
void dtu_data_push_cleanup(void);

/**
 * @brief 启动数据推送服务
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_start(void);

/**
 * @brief 停止数据推送服务
 */
void dtu_data_push_stop(void);

/**
 * @brief 推送采集数据
 * @param result 采集结果
 * @param urgent 是否紧急
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_data(const collect_result_t* result, bool urgent);

/**
 * @brief 推送自定义数据
 * @param data 数据内容
 * @param length 数据长度
 * @param topic 主题或路径
 * @param urgent 是否紧急
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_custom(const void* data, size_t length, const char* topic, bool urgent);

/**
 * @brief 获取推送统计信息
 * @param stats 输出统计信息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_get_stats(push_stats_t* stats);

/**
 * @brief 重置推送统计信息
 */
void dtu_data_push_reset_stats(void);

/**
 * @brief 获取连接状态
 * @return true 已连接，false 未连接
 */
bool dtu_data_push_is_connected(void);

/**
 * @brief 重新连接服务器
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_reconnect(void);

/**
 * @brief 清空任务队列
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_clear_queue(void);

/**
 * @brief 获取队列中的任务数量
 * @return 任务数量
 */
int dtu_data_push_get_queue_size(void);

/**
 * @brief 设置状态回调函数
 * @param callback 回调函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_set_status_callback(void (*callback)(bool connected, const char* message, void* user_data),
                                              void* user_data);

/**
 * @brief 更新推送配置
 * @param config 新的推送配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_update_config(const push_config_t* config);

/**
 * @brief 获取当前推送配置
 * @param config 输出配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_get_config(push_config_t* config);

/**
 * @brief 测试推送连接
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_test_connection(void);

/**
 * @brief 格式化数据为JSON
 * @param result 采集结果
 * @param json_str 输出JSON字符串
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_format_json(const collect_result_t* result, char* json_str, size_t size);

/**
 * @brief 格式化数据为XML
 * @param result 采集结果
 * @param xml_str 输出XML字符串
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_format_xml(const collect_result_t* result, char* xml_str, size_t size);

/**
 * @brief 格式化数据为CSV
 * @param result 采集结果
 * @param csv_str 输出CSV字符串
 * @param size 缓冲区大小
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_data_push_format_csv(const collect_result_t* result, char* csv_str, size_t size);

/**
 * @brief 推送协议转换为字符串
 * @param protocol 推送协议
 * @return 协议字符串
 */
const char* dtu_push_protocol_string(push_protocol_t protocol);

/**
 * @brief 从字符串解析推送协议
 * @param str 协议字符串
 * @return 推送协议
 */
push_protocol_t dtu_push_protocol_from_string(const char* str);

/**
 * @brief 数据格式转换为字符串
 * @param format 数据格式
 * @return 格式字符串
 */
const char* dtu_data_format_string(data_format_t format);

/**
 * @brief 从字符串解析数据格式
 * @param str 格式字符串
 * @return 数据格式
 */
data_format_t dtu_data_format_from_string(const char* str);

#endif /* DTU_DATA_PUSH_H */
